package business.semestre;

import java.util.List;
import dao.DaoException;
import dao.IDao;

import validation.Validate;
import auth.service.User;
import entites.Domaine;
import entites.GroupeUe;
import entites.Parcours;
import entites.Semestre;

/**
 * @author Olivier SENENTZ
 *
 */
public class SemestreManager implements ISemestreManager {

	private IDao dao;
	private Validate validator;
	
	
	public IDao getDao() {
		return dao;
	}


	public void setDao(IDao dao) {
		this.dao = dao;
	}


	/**
	 * Constructeur de la classe SemestreManager
	 */
	public SemestreManager() {
		//dao = new Dao();
		//validator = new Validate();
	}

	
	/**
	 * {@inheritDoc}
	 */
	
	public void deleteSemestre(Semestre semestre, User user, Domaine domaine)
			throws SemestreManagerException {
		//test des droits
		if (! user.isInCharge(user, domaine)){
			throw new SemestreManagerException("Vous n'avez pas les droits pour effectuer cette action");
		}
		//suppression du semestre
		try{
			dao.deleteSemestre(semestre.getCode()); 
		}
		catch(DaoException e){
			System.out.println(e);
			throw new SemestreManagerException("probleme dans la DAO");
		}
	}

	
	/**
	 * {@inheritDoc}
	 */
	
	public void insertSemestre(Semestre semestre, List<GroupeUe> listGroupeUe, User user,Domaine domaine)
	throws SemestreManagerException{
		//test des droits
		if (! user.isInCharge(user, domaine)){
			throw new SemestreManagerException("Vous n'avez pas les droits pour effectuer cette action");
		}
		//validation (appel de la fonction validation pour le semestre et pour chaque groupe UE)
		try{
			validation(semestre, null, user); 
		}
		catch(Exception e){
			System.out.println(e);
			throw new SemestreManagerException("contenu semestre non valide");
			//TODO verifier l exception que renvoie la validation 
		}
		//ajout du semestre, des Groupes UE
		
		try{
			dao.addSemestreToDomaine(semestre, domaine);
			//creation groupe ue obligatoire
			if(listGroupeUe.size() > 0)
			{
				for ( int i = 0; i < listGroupeUe.size() ; i++){
					dao.addGroupeUeToSemestre(listGroupeUe.get(i), semestre);
				}
			}else
				throw new SemestreManagerException("semestre mal compose");
		}catch(DaoException e){
			throw new SemestreManagerException("erreur de Dao");
		}
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public List<Semestre> showDashBoardSemestre(User user,Domaine domaine)
			throws SemestreManagerException
	{
		List<Semestre> listSemestre = null;
		
		if (user.isInCharge(user, domaine))
		{
			try
			{
				listSemestre = dao.findAllSemestreIntoDomaine(domaine);
			}
			catch (DaoException e)
			{
				throw new SemestreManagerException("erreur de DAO");
			}
			return listSemestre;
		}
		
		if(user.isInCharge(user, domaine))
		{
			List<Semestre> listSemestreTemp = null;	
			List<Parcours> listParcours = null;
			
			//TODO = dao.find    //user.getListParcours();
			listParcours = dao.FindParcoursOfResponsable(user);
	
			try
			{
				for( int i = 0 ; i < listParcours.size() ; i++ ){
					listSemestreTemp = dao.findAllSemestreIntoParcours(listParcours.get(i));
					for( int j = 0 ; j < listSemestreTemp.size() ; j++ ){
						listSemestre.add(listSemestreTemp.get(j));
					}
				}
			}
			catch (DaoException e){
				throw new SemestreManagerException("erreur de DAO");
			}
			return listSemestre;
		}
		throw new SemestreManagerException("Vous n'avez pas les droits de faire cette action");
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	
	public void updateSemestre(Semestre semestre, User user) 
			throws SemestreManagerException {
		//responsable parcours
		//test des droits
		//TODO isInCharge(parcours?)
		if (! user.isInCharge(user, semestre)){
			throw new SemestreManagerException("Vous n'avez pas les droits pour effectuer cette action");
		}
		validation(semestre, null, user);
		try{
			dao.updateSemestre(semestre);
		}catch(DaoException e ){
			throw new SemestreManagerException("erreur de mise a jour du semestre");
		}
		System.out.println("semestre mis a jour");		
	}


	/**
	 * {@inheritDoc}
	 */
	
	public void updateSemestre(Semestre semestre, List<GroupeUe> listGroupeUe, User user,Domaine domaine) 
			throws SemestreManagerException {
		//responsable de domaine
		//test des droits
		if (! user.isInCharge(user, domaine)){
			throw new SemestreManagerException("Vous n'avez pas les droits pour effectuer cette action");
		}
		try{
			validation(semestre,null,user);
			for(int i = 0 ; i < listGroupeUe.size() ; i++){
				validator.validate(listGroupeUe.get(i));
			}
			dao.updateSemestre(semestre);
			for(int i = 0 ; i < listGroupeUe.size() ; i++){
				dao.updateGroupeUe(listGroupeUe.get(i));
			}
		}
		catch(DaoException e){
			throw new SemestreManagerException("erreur lors de la mise a jour du semestre et des groupes UE");
		}
		System.out.println("semestre et groupe UE mis a jour");
	}

	
	/**
	 * {@inheritDoc}
	 */
	public void validation(Semestre semestre, List<GroupeUe> listGroupeUe, User user) 
			throws SemestreManagerException {
		List<String> listError = null;
		try{
			listError = validator.validate(semestre);
			if ( listError != null){
				throw new SemestreManagerException(listError.get(0));
			}
		}catch(Exception e){
			throw new SemestreManagerException("erreur dans la validation");
		}
		if ( listGroupeUe != null )
		try{
			for( int i = 0 ; i < listGroupeUe.size(); i++ ){
				listError = validator.validate(listGroupeUe.get(i));
				if ( listError != null){
					throw new SemestreManagerException(listGroupeUe.get(i)+ " : " + listError.get(0));
				}
			}
		}catch(Exception e){
			throw new SemestreManagerException("erreur dans la validation");
		}
		//validation seconde partie
		//test du nombre de credits semestre et du nombre de credits des groupes qui le compose
		int nbCreditsGroupes = 0;
		for ( int i = 0 ; i < listGroupeUe.size() ; i++)
			if (listGroupeUe.get(i).getType() != "facultatif")
				nbCreditsGroupes = nbCreditsGroupes + listGroupeUe.get(i).getNbCredits();
		if ( nbCreditsGroupes > semestre.getNbCredits() ){
			throw new SemestreManagerException("Le nombre de credits des Groupes d'UE qui composent le semestre sont superieur au nombre de credits du semestre");
		}
		//rajouter mes test persos
		
	}

}
